home *** CD-ROM | disk | FTP | other *** search
/ Network CD 1 / Network CD.iso / fredfish / 901-910 / ff907 / cyberpager / source / source.lha / library / lockFile.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-18  |  2.0 KB  |  94 lines

  1. #include "memory.h"
  2.  
  3. typedef struct {
  4.     struct Node Node;
  5.     ULONG LockCount;
  6. } LockNode_t;
  7.  
  8. BOOL __saveds __asm LockFile(register __a0 PagerHandle_t * ph, register __a1 STRPTR fileName)
  9. {
  10.     STRPTR ptr;
  11.     LockNode_t *node, *n;
  12.  
  13.     ptr = FilePart(fileName);
  14.  
  15.     if (node = MyAllocVec(sizeof(LockNode_t) + strlen(ptr) + 16)) {
  16.         node->Node.ln_Name = (char *)&node[1];
  17.  
  18.         strcpy(node->Node.ln_Name, ptr);
  19.         strcat(node->Node.ln_Name, ".LOCK");
  20.  
  21.         ObtainSemaphore(&ph->ph_Sema);
  22.  
  23.         for (n = (LockNode_t *) ph->ph_LockList.lh_Head;
  24.              n->Node.ln_Succ;
  25.              n = (LockNode_t *) n->Node.ln_Succ)
  26.             if (stricmp(node->Node.ln_Name, n->Node.ln_Name) == 0) {
  27.                 n->LockCount++;
  28.                 MyFreeVec(node);
  29.                 ReleaseSemaphore(&ph->ph_Sema);
  30.                 return TRUE;
  31.             }
  32.  
  33.         if (ptr = LockDevUnit(node->Node.ln_Name, 0, ph->ph_LogProgram, 0)) {
  34.             ULog(ph, -1, "LockDevUnit() failed: %s", ptr);
  35.         }
  36.  
  37.         node->LockCount = 1;
  38.         AddTail(&ph->ph_LockList, &node->Node);
  39.  
  40.         ReleaseSemaphore(&ph->ph_Sema);
  41.  
  42.         return TRUE;
  43.     }
  44.  
  45.     ReleaseSemaphore(&ph->ph_Sema);
  46.  
  47.     return FALSE;
  48. }
  49.  
  50. static void __inline FreeLockNode(LockNode_t * node)
  51. {
  52.     Remove(&node->Node);
  53.  
  54.     FreeDevUnit(node->Node.ln_Name, 0);
  55.  
  56.     MyFreeVec(node);
  57. }
  58.  
  59. void __saveds __asm UnLockFile(register __a0 PagerHandle_t * ph, register __a1 STRPTR fileName)
  60. {
  61.     STRPTR ptr;
  62.     int ptrLen;
  63.     LockNode_t *n;
  64.  
  65.     ptr = FilePart(fileName);
  66.     ptrLen = strlen(ptr);
  67.  
  68.     ObtainSemaphore(&ph->ph_Sema);
  69.  
  70.     for (n = (LockNode_t *) ph->ph_LockList.lh_Head;
  71.          n->Node.ln_Succ;
  72.          n = (LockNode_t *) n->Node.ln_Succ)
  73.         if ((strnicmp(ptr, n->Node.ln_Name, ptrLen) == 0) && (strcmp(".LOCK", &n->Node.ln_Name[ptrLen]) == 0)) {
  74.             if (--n->LockCount == 0)
  75.                 FreeLockNode(n);
  76.  
  77.             break;
  78.         }
  79.  
  80.     ReleaseSemaphore(&ph->ph_Sema);
  81. }
  82.  
  83. void __saveds __asm UnLockFiles(register __a0 PagerHandle_t * ph)
  84. {
  85.     LockNode_t *n;
  86.  
  87.     ObtainSemaphore(&ph->ph_Sema);
  88.  
  89.     while ((n = (LockNode_t *) ph->ph_LockList.lh_Head) != (LockNode_t *) & ph->ph_LockList.lh_Tail)
  90.         FreeLockNode(n);
  91.  
  92.     ReleaseSemaphore(&ph->ph_Sema);
  93. }
  94.